Фоновое слайдшоу изображений на весь экран с помощью CSS3
Технология CSS3 становится все более популярной, а вещи которые с ее помощью реализуются, все более впечатляющими и захватывающими. Сегодня пост об одном из таких приемов. Если вы помните, некоторое время назад я рассказывал как сделать фон ссылкой с html / css, где вкратце упоминал возможность случайного вывода нескольких картинок. Это все хорошо, но есть куда более впечатляющий вариант — вывод автоматически чередующейся «эпической» масштабной HD графики высокого качества на весь экран браузера. Так вот недавно в сети наткнулся на небольшой урок, что позволяет расположить в качестве фона слайдшоу такие большие изображения, причем с применением анимации.
Кроме того, на странице выводится заголовок картинки и тоже с помощью CSS. Смотрится очень круто! Хотя нужно уточнить, что работать это будет только в тех браузерах, которые поддерживают CSS анимацию. Итак, поехали:
Разметка страницы
Для нашего слайдшоу будем использовать неупорядоченный список, где для каждой картинки добаим тег Span, а в DIV будет размещаться заголовок.
<ul class="cb-slideshow"> <li> <span>Image 01</span> <div> <h3>re·lax·a·tion</h3> </div> </li> <li><!--...--></li> <li><!--...--></li> </ul> |
Для каждого элемента Span будут закреплено определенное фоновое изображение (background image) для слайдшоу.
CSS стили
Для начала нужно задать стили для самого списка — он будет с фиксированной позицией, но растянутым на всю область видимости. Кроме того используется псевдоэлемент :after дабы расположить некоторый рисунок (с эффектом) поверх изображения:
.cb-slideshow, .cb-slideshow:after { position: fixed; width: 100%; height: 100%; top: 0px; left: 0px; z-index: 0; } .cb-slideshow:after { content: ''; background: transparent url(../images/pattern.png) repeat top left; } |
В коде использовалось повторение стиля .cb-slideshow с картинкой для создания эффекта изображения, хотя с таким же успехом можно попробовать разместить градиент.
Span, содержащий фоновые изображения, будет позиционироваться абсолютно и иметь высоту и ширину 100%. Поскольку у него внутри будет определенный текст, сделаем прозрачным color так как мы не хотим его отображать. Свойство background-size с значением cover позволит удостовериться в том, что фоновое изображение покрывает всю площадь элемента, который в свою очередь растягивается на всю ширину видимого экрана. Прозрачность установлена в значение 0, это будет изменено уже при анимации.
.cb-slideshow li span { width: 100%; height: 100%; position: absolute; top: 0px; left: 0px; color: transparent; background-size: cover; background-position: 50% 50%; background-repeat: none; opacity: 0; z-index: 0; animation: imageAnimation 36s linear infinite 0s; } |
Анимация для каждого Span будет длится как минимум 36 секунд и запускаться бесконечное число раз. Но для начала рассмотрим как решить вопрос с отображаемым заголовком:
.cb-slideshow li div { z-index: 1000; position: absolute; bottom: 30px; left: 0px; width: 100%; text-align: center; opacity: 0; color: #fff; animation: titleAnimation 36s linear infinite 0s; } .cb-slideshow li div h3 { font-family: 'BebasNeueRegular', 'Arial Narrow', Arial, sans-serif; font-size: 240px; padding: 0; line-height: 200px; } |
Анимация для блока заголовка также будет длится 36 секунд.
Далее в CSS стилях следует определить фоновые изображения для каждого Span и задержку анимации (animation delay) дабы каждая следующая картинка и заголовок появлялась через 6 секунд после предыдущего.
.cb-slideshow li:nth-child(1) span { background-image: url(../images/1.jpg) } .cb-slideshow li:nth-child(2) span { background-image: url(../images/2.jpg); animation-delay: 6s; } .cb-slideshow li:nth-child(3) span { background-image: url(../images/3.jpg); animation-delay: 12s; } .cb-slideshow li:nth-child(4) span { background-image: url(../images/4.jpg); animation-delay: 18s; } .cb-slideshow li:nth-child(5) span { background-image: url(../images/5.jpg); animation-delay: 24s; } .cb-slideshow li:nth-child(6) span { background-image: url(../images/6.jpg); animation-delay: 30s; } .cb-slideshow li:nth-child(2) div { animation-delay: 6s; } .cb-slideshow li:nth-child(3) div { animation-delay: 12s; } .cb-slideshow li:nth-child(4) div { animation-delay: 18s; } .cb-slideshow li:nth-child(5) div { animation-delay: 24s; } .cb-slideshow li:nth-child(6) div { animation-delay: 30s; } |
Теперь рассмотрим процесс анимации более детально. Элементам Span установлено время анимации 36 секунд. За это время прозрачность будет меняться с 0 до 1 когда анимация достигает 8%. Дальше прозрачность сохраняется пока не достигнем 17%. После 25% она снова должна быть равна нулю и оставаться такой до конца.
Откуда взялись эти цифры? — давайте разбираться. Мы хотим чтобы каждое изображение было видимым 6 секунд, кроме того, после прохождения всего цикла опять должна быть показана первая картинка. Поскольку всего используется 6 изображений, итого потребуется 36 секунд. Теперь нам нужно задать соответствующие значения по времени для прозрачности. Зная тот факт, что второй кадр (картинка) анимации начнется через 6 секунд нам нужно знать какой процентиль анимации должен быть для показа первой картинки. Разделим 6 на 36 и получим 0.166… что будет 16% для нашего шага параметра keyframe. Теперь, поскольку мы не хотим дабы наша картинка просто исчезала все время, определим промежуточный шаг, который будет равен половине полученного ранее значения, то есть 8%. Суть в том, чтобы картинка показалась полностью, после того постепенно исчезала на 17%, и соответственно полностью исчезла на 25%. (ред. — тут, конечно, придется немного помозговать и разобраться со всеми тонкостями анимации и математических действий. Если захотите использовать использовать код «как есть» — просто разместите его в стилях либо делайте аналогичные расчеты).
@keyframes imageAnimation { 0% { opacity: 0; animation-timing-function: ease-in; } 8% { opacity: 1; animation-timing-function: ease-out; } 17% { opacity: 1 } 25% { opacity: 0 } 100% { opacity: 0 } } |
Аналогичные расчеты применимы и для анимации заголовка, единственное что мыс делаем дабы он немного быстрее исчезал, поэтому прозрачность = 0 на 19%.
@keyframes titleAnimation { 0% { opacity: 0 } 8% { opacity: 1 } 17% { opacity: 1 } 19% { opacity: 0 } 100% { opacity: 0 } } |
Для всех интернет браузеров, которые не поддерживают анимацию мы просто показываем последнее изображение слайдшоу, установив прозрачность этого Span равную 1.
.no-cssanimations .cb-slideshow li span{ opacity: 1; } |
Напоследок можно позаботиться о размере шрифта, когда область просмотра меньше. Будем использовать media queries дабы задать шрифт меньше для определенных значений ширины.
@media screen and (max-width: 1140px) { .cb-slideshow li div h3 { font-size: 140px } } @media screen and (max-width: 600px) { .cb-slideshow li div h3 { font-size: 80px } } |
Пожалуй, на этом все для самой простой версии слайдшоу с фоновыми изображениями на весь экран. Хотя можно кое-что добавить в процесс перехода между картинками.
Альтернативная анимация
Следующий пример кода вместе с изменением масштаба изображения также добавляет небольшой поворот:
@keyframes imageAnimation { 0% { opacity: 0; animation-timing-function: ease-in; } 8% { opacity: 1; transform: scale(1.05); animation-timing-function: ease-out; } 17% { opacity: 1; transform: scale(1.1) rotate(3deg); } 25% { opacity: 0; transform: scale(1.1) rotate(3deg); } 100% { opacity: 0 } } |
Заголовок должен будет «выезжать» справа (нужно изменить text-align блоков в значение right), после чего убираться перемещаясь влево с эффектом исчезновения:
@keyframes titleAnimation { 0% { opacity: 0; transform: translateX(200px); } 8% { opacity: 1; transform: translateX(0px); } 17% { opacity: 1; transform: translateX(0px); } 19% { opacity: 0; transform: translateX(-400px); } 25% { opacity: 0 } 100% { opacity: 0 } } |
Вот, в принципе, и все. На этой странице вы можете найти демо версии (примеры) работы CSS3 эффектов. Экспериментируйте с разными эффектами и анимацией для заголовков и картинок. Следует также заметить, что в данный момент наиболее красиво и плавно это слайдшоу будет работать в браузерах с поддержкой Webkit таких как Chrome и особенно Safari. На остальных, увы, может быть заметно подтормаживание, но в целом впечатления от подобной галереи думаю у каждого будет хорошим.
Хотите украсить свой дачный участок, где все уже есть? — установите фонтан причем побольше и покрасивеее, куда можно подключить разные звуко-музыкальные эффекты.
Спасибо, нужно попробовать, если получится…
Круто! как сказал Джобс — «Большие картинки и шрифты не могут быть ошибкой»
Повторил все как в примере, но проблема в том, что не масштабируются картинки, при изменении размера браузера или разрешении экрана. Картинки остаются своих физических размеров и не уменьшаются, когда браузер уменьшаешь. В демо-примере ваши картинки масштабируются, при изменении окна браузера. Как достичь этого эффекта?
Помогите пожалуйста. При изменении размера окна браузера, на вашем примере, картинки уменьшаются и увеличиваются, а я сделал все как в примере, но они меняются. Все картинки показываются в своих физических размерах и не меняются, при изменении размера окна браузера.
Проблему с увеличением картинок решил. Путь к файлам в css был не правильный. ))
Сейчас пытаюсь разобраться с анимацией. Дело в том, что у меня не 6 картинок, а 4. Мои четыре картинки сменяют друг друга, но потом видимо отсекается время для еще двух картинок, так как четвертая картинка исчезает и только после паузы, снова начинается цикл показа с первой картинки.
Какие именно изменения нужно внести, чтобы сократить время для показа не шести, а четырех картинок?
Извините, что нафлудил у вас тут )) Помогите пожалуйста разобраться. Если имеем не 6, а 4 картинки, то что сделать, чтобы не было пауз между показом кадров?
Я сделал так:
.cb-slideshow li span {
animation: 24s linear 0s normal none infinite imageAnimation;
…}
Тут изменил количество времени на весь цикл, с 36, на 24 сек.
После чего удалил:
.cb-slideshow li:nth-child(5) span {
background-image: url(../images/5.jpg);
animation-delay: 24s;
}
.cb-slideshow li:nth-child(6) span {
background-image: url(../images/6.jpg);
animation-delay: 30s;
}
Так получаю смену картинок, с паузой секунды в две между ними. Как сократить время этой паузы? Спасибо.
Алексей, если честно сходу сложно вникнуть в этот код, т.к. статья была опубликована достаточно давно. Попробуйте уменьшить значение animation-delay для nth-child(1-4) и посмотреть что будет.
подскажите пожалуйста установил данный слайдер на сайт под управлением opencart, теперь возникла проблема, картинки перекрывают некоторые элементы сайта и по ним нельзя нажать мышкой то есть перейти в другой раздел, во время смены слайда некоторые элементы проявляются но все равно нажать и перейти на другой раздел нельзя
Иаан, с помощью CSS стилей вам нужно сделать так чтобы элементы не накладывались друг на друга. Кстати, можете еще почитать про CSS свойства z-index, возможно пригодится. Но в общем, суть задачи именно разделить элементы, чтобы каждый из них был в своей конкретной области и не залезал на другой. Дабы видеть границы в CSS стилях для элементов можно добавить рамку (border).
Классная тема! блин я бы в жизни сам не додумался так сделать